package com.hollis公众号.自动拆装箱与缓存;

public class Test {

	/**上面这段代码真正的输出结果：

	integer1 == integer2
	integer3 != integer4
	原因就和Integer中的缓存机制有关。在Java 5中，在Integer的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用。

	适用于整数值区间-128 至 +127。
	只适用于自动装箱。使用构造函数创建对象不适用。

	当需要进行自动装箱时，如果数字在-128至127之间时，会直接使用缓存中的对象，而不是重新创建一个对象。
	其中的javadoc详细的说明了缓存支持-128到127之间的自动装箱过程。最大值127可以通过-XX:AutoBoxCacheMax=size修改。
	实际上这个功能在Java 5中引入的时候,范围是固定的-128 至 +127。后来在Java 6中，可以通过java.lang.Integer.IntegerCache.high设置最大值。
	这使我们可以根据应用程序的实际情况灵活地调整来提高性能。到底是什么原因选择这个-128到127范围呢？因为这个范围的数字是最被广泛使用的。 在程序中，第一次使用Integer的时候也需要一定的额外时间来初始化这个缓存。

	在Boxing Conversion部分的Java语言规范(JLS)规定如下：
	如果一个变量p的值是：
	-128至127之间的整数(§3.10.1)
	true 和 false的布尔值 (§3.10.3)
	‘\u0000’至 ‘\u007f’之间的字符(§3.10.4)
	范围内的时，将p包装成a和b两个对象时，可以直接使用a==b判断a和b的值是否相等。
	 * @param strings
	 */
	public static void main(String... strings) {

	    Integer integer1 = 3;
	    Integer integer2 = 3;

	    if (integer1 == integer2)
	        System.out.println("integer1 == integer2");
	    else
	        System.out.println("integer1 != integer2");

	    Integer integer3 = 300;
	    Integer integer4 = 300;

	    if (integer3 == integer4)
	        System.out.println("integer3 == integer4");
	    else
	        System.out.println("integer3 != integer4");

	    Boolean b = true;
	    Boolean b2 = true;

	    if(b == b2)
	    	System.out.println("b == b2");
	    else
	    	System.out.println("b != b2");

	}

}
